package code.example.base.collection.map;

import code.example.tool.LogFactory;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.BiConsumer;

/**
 *  LinkedHashMap 在HashMap 的基础上,记录put顺序,遍历时按顺序,遍历.
 *   HashMap 中链表是Node对象,LinkedHashMap 扩展了Entry extends Node ,增加了before after 两个指针,记录上一个,下一个节点.
 *   并在 LinkedHashMap中成员变量，head 记录第一个put 的Entry,Tail 最后一个Entry
 *
 *   LinkedHashMap 可以变为改LRU cache。
 *
 public LRUCache (int cacheSize) {
 this.cacheSize = cacheSize;
 int hashTableCapacity = (int)Math.ceil(cacheSize / hashTableLoadFactor) + 1;
 map = new LinkedHashMap<K,V>(hashTableCapacity, hashTableLoadFactor, true) {//true 表示当key被访问时，是否移到链表的尾部？？即表的Head是最近最少访问的。
 // (an anonymous inner class)
 private static final long serialVersionUID = 1;
 @Override protected boolean removeEldestEntry (Map.Entry<K,V> eldest) {
 return size() > LRUCache.this.cacheSize; }};
 }//当put触发时，调用removeEldestEntry方法，如果返回为true,则移除head ,(即最近最少访问的)

  *   hashMap 的三个扩展点：
  void afterNodeAccess(Node<K,V> p) { }//把Node移到链表结尾，以实现head 为最近没有访问的节点
 void afterNodeInsertion(boolean evict) { }//调用removeEldestEntry返回true,则删除Head.
 void afterNodeRemoval(Node<K,V> p) { }//从顺序列链中移除节点

 *
 */
public class TestLinkedHashMap {
    public void test(){
        int count = 100;
        Map<Integer,Integer > map = new LinkedHashMap<>((int)(count/0.75));
        for(int i=0;i<count;i++){
            map.put(i,Integer.reverse(i));
        }

        map.forEach(new BiConsumer<Integer, Integer>() {
            @Override
            public void accept(Integer key, Integer value) {
                LogFactory.getLog().info("key:"+key+",value:"+value+" ,key:"+Integer.toBinaryString(key)+",value:"+Integer.toBinaryString(value));
            }
        });
    }
    public static void main(String args []){
        new TestHashMap().test();
    }
}
